Micron Document
🎖️GitЯра🎖️

feature/settings/src/main/kotlin/org/meshtastic/feature/settings/debugging/Debug.kt 1c3784235e7e20ed88e054097d2e7addbff92dc3 (1c378423) Text, 30.39 KB

T8b949e/*
* Copyright (c) 2025 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/

Tff7b72package T7ee787org.meshtastic.feature.settings.debugging

Tff7b72import T7ee787android.content.Context
Tff7b72import T7ee787android.net.Uri
Tff7b72import T7ee787androidx.activity.compose.rememberLauncherForActivityResult
Tff7b72import T7ee787androidx.activity.result.contract.ActivityResultContracts
Tff7b72import T7ee787androidx.compose.animation.core.animateFloatAsState
Tff7b72import T7ee787androidx.compose.foundation.BorderStroke
Tff7b72import T7ee787androidx.compose.foundation.clickable
Tff7b72import T7ee787androidx.compose.foundation.layout.Arrangement
Tff7b72import T7ee787androidx.compose.foundation.layout.Box
Tff7b72import T7ee787androidx.compose.foundation.layout.Column
Tff7b72import T7ee787androidx.compose.foundation.layout.Row
Tff7b72import T7ee787androidx.compose.foundation.layout.fillMaxSize
Tff7b72import T7ee787androidx.compose.foundation.layout.fillMaxWidth
Tff7b72import T7ee787androidx.compose.foundation.layout.padding
Tff7b72import T7ee787androidx.compose.foundation.lazy.LazyColumn
Tff7b72import T7ee787androidx.compose.foundation.lazy.items
Tff7b72import T7ee787androidx.compose.foundation.lazy.rememberLazyListState
Tff7b72import T7ee787androidx.compose.foundation.text.selection.SelectionContainer
Tff7b72import T7ee787androidx.compose.material.icons.Icons
Tff7b72import T7ee787androidx.compose.material.icons.filled.Delete
Tff7b72import T7ee787androidx.compose.material.icons.outlined.FileDownload
Tff7b72import T7ee787androidx.compose.material.icons.twotone.FilterAltOff
Tff7b72import T7ee787androidx.compose.material3.Card
Tff7b72import T7ee787androidx.compose.material3.CardDefaults
Tff7b72import T7ee787androidx.compose.material3.ColorScheme
Tff7b72import T7ee787androidx.compose.material3.Icon
Tff7b72import T7ee787androidx.compose.material3.IconButton
Tff7b72import T7ee787androidx.compose.material3.MaterialTheme
Tff7b72import T7ee787androidx.compose.material3.OutlinedTextField
Tff7b72import T7ee787androidx.compose.material3.Scaffold
Tff7b72import T7ee787androidx.compose.material3.Surface
Tff7b72import T7ee787androidx.compose.material3.Text
Tff7b72import T7ee787androidx.compose.material3.TextButton
Tff7b72import T7ee787androidx.compose.runtime.Composable
Tff7b72import T7ee787androidx.compose.runtime.LaunchedEffect
Tff7b72import T7ee787androidx.compose.runtime.derivedStateOf
Tff7b72import T7ee787androidx.compose.runtime.getValue
Tff7b72import T7ee787androidx.compose.runtime.mutableStateOf
Tff7b72import T7ee787androidx.compose.runtime.remember
Tff7b72import T7ee787androidx.compose.runtime.rememberCoroutineScope
Tff7b72import T7ee787androidx.compose.runtime.setValue
Tff7b72import T7ee787androidx.compose.ui.Alignment
Tff7b72import T7ee787androidx.compose.ui.Modifier
Tff7b72import T7ee787androidx.compose.ui.graphics.Color
Tff7b72import T7ee787androidx.compose.ui.graphics.graphicsLayer
Tff7b72import T7ee787androidx.compose.ui.platform.LocalContext
Tff7b72import T7ee787androidx.compose.ui.text.AnnotatedString
Tff7b72import T7ee787androidx.compose.ui.text.SpanStyle
Tff7b72import T7ee787androidx.compose.ui.text.TextStyle
Tff7b72import T7ee787androidx.compose.ui.text.buildAnnotatedString
Tff7b72import T7ee787androidx.compose.ui.text.font.FontFamily
Tff7b72import T7ee787androidx.compose.ui.text.font.FontStyle
Tff7b72import T7ee787androidx.compose.ui.text.font.FontWeight
Tff7b72import T7ee787androidx.compose.ui.tooling.preview.PreviewLightDark
Tff7b72import T7ee787androidx.compose.ui.unit.dp
Tff7b72import T7ee787androidx.compose.ui.unit.sp
Tff7b72import T7ee787androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
Tff7b72import T7ee787androidx.lifecycle.compose.collectAsStateWithLifecycle
Tff7b72import T7ee787kotlinx.collections.immutable.toImmutableList
Tff7b72import T7ee787kotlinx.coroutines.Dispatchers
Tff7b72import T7ee787kotlinx.coroutines.launch
Tff7b72import T7ee787kotlinx.coroutines.withContext
Tff7b72import T7ee787org.jetbrains.compose.resources.stringResource
Tff7b72import T7ee787org.meshtastic.core.strings.Res
Tff7b72import T7ee787org.meshtastic.core.strings.debug_clear
Tff7b72import T7ee787org.meshtastic.core.strings.debug_clear_logs_confirm
Tff7b72import T7ee787org.meshtastic.core.strings.debug_decoded_payload
Tff7b72import T7ee787org.meshtastic.core.strings.debug_export_failed
Tff7b72import T7ee787org.meshtastic.core.strings.debug_export_success
Tff7b72import T7ee787org.meshtastic.core.strings.debug_filters
Tff7b72import T7ee787org.meshtastic.core.strings.debug_logs_export
Tff7b72import T7ee787org.meshtastic.core.strings.debug_panel
Tff7b72import T7ee787org.meshtastic.core.ui.component.CopyIconButton
Tff7b72import T7ee787org.meshtastic.core.ui.component.MainAppBar
Tff7b72import T7ee787org.meshtastic.core.ui.component.SimpleAlertDialog
Tff7b72import T7ee787org.meshtastic.core.ui.theme.AnnotationColor
Tff7b72import T7ee787org.meshtastic.core.ui.theme.AppTheme
Tff7b72import T7ee787org.meshtastic.core.ui.util.showToast
Tff7b72import T7ee787org.meshtastic.feature.settings.debugging.DebugViewModel.UiMeshLog
Tff7b72import T7ee787timber.log.Timber
Tff7b72import T7ee787java.io.IOException
Tff7b72import T7ee787java.io.OutputStreamWriter
Tff7b72import T7ee787java.nio.charset.StandardCharsets
Tff7b72import T7ee787java.text.SimpleDateFormat
Tff7b72import T7ee787java.util.Date
Tff7b72import T7ee787java.util.Locale

Tff7b72private Tff7b72val Te6edf3REGEX_ANNOTATED_NODE_ID Tff7b72= Te6edf3RegexTb4b4b4(Ta5d6ff"Ta5d6ff\\Ta5d6ff(![0-9a-fA-F]{8}Ta5d6ff\\Ta5d6ff)$Ta5d6ff"Tb4b4b4, Te6edf3RegexOptionTb4b4b4.Te6edf3MULTILINETb4b4b4)

T8b949e// list of dict keys to redact when exporting logs. These are evaluated as line.contains, so partials are fine.
Tff7b72private Tff7b72var Te6edf3redactedKeysTb4b4b4: Te6edf3ListTff7b72<Tffa657StringTff7b72> Tff7b72= Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffsession_passkeyTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffprivate_keyTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffadmin_keyTa5d6ff"Tb4b4b4)

Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongMethodTa5d6ff"Tb4b4b4)
Tf0883e@Composable
Tff7b72fun Td2a8ffDebugScreenTb4b4b4(Te6edf3onNavigateUpTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4, Te6edf3viewModelTb4b4b4: Te6edf3DebugViewModel Tff7b72= Te6edf3hiltViewModelTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3listState Tff7b72= Te6edf3rememberLazyListStateTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3logs Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3meshLogTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3searchState Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3searchStateTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3filterTexts Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3filterTextsTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3selectedLogId Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3selectedLogIdTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3context Tff7b72= Te6edf3LocalContextTb4b4b4.Te6edf3current
Tff7b72val Te6edf3scope Tff7b72= Te6edf3rememberCoroutineScopeTb4b4b4(Tb4b4b4)

Tff7b72var Te6edf3filterMode Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Te6edf3FilterModeTb4b4b4.Te6edf3ORTb4b4b4) Tb4b4b4}

Tff7b72val Te6edf3filteredLogsState Tff7b72by
Te6edf3rememberTb4b4b4(Te6edf3logsTb4b4b4, Te6edf3filterTextsTb4b4b4, Te6edf3filterModeTb4b4b4) Tb4b4b4{
Te6edf3derivedStateOf Tb4b4b4{ Te6edf3viewModelTb4b4b4.Te6edf3filterManagerTb4b4b4.Te6edf3filterLogsTb4b4b4(Te6edf3logsTb4b4b4, Te6edf3filterTextsTb4b4b4, Te6edf3filterModeTb4b4b4)Tb4b4b4.Te6edf3toImmutableListTb4b4b4(Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tff7b72val Te6edf3filteredLogs Tff7b72= Te6edf3filteredLogsState

Te6edf3LaunchedEffectTb4b4b4(Te6edf3filteredLogsTb4b4b4) Tb4b4b4{ Te6edf3viewModelTb4b4b4.Te6edf3updateFilteredLogsTb4b4b4(Te6edf3filteredLogsTb4b4b4) Tb4b4b4}

Tff7b72val Te6edf3shouldAutoScroll Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3derivedStateOf Tb4b4b4{ Te6edf3listStateTb4b4b4.Te6edf3firstVisibleItemIndex Tff7b72< T79c0ff3 Tb4b4b4} Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3shouldAutoScrollTb4b4b4) Tb4b4b4{
Te6edf3LaunchedEffectTb4b4b4(Te6edf3filteredLogsTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3listStateTb4b4b4.Te6edf3isScrollInProgressTb4b4b4) Tb4b4b4{
Te6edf3listStateTb4b4b4.Te6edf3animateScrollToItemTb4b4b4(T79c0ff0Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
T8b949e// Handle search result navigation
Te6edf3LaunchedEffectTb4b4b4(Te6edf3searchStateTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3searchStateTb4b4b4.Te6edf3currentMatchIndex Tff7b72>Tff7b72= T79c0ff0 Tff7b72&Tff7b72& Te6edf3searchStateTb4b4b4.Te6edf3currentMatchIndex Tff7b72< Te6edf3searchStateTb4b4b4.Te6edf3allMatchesTb4b4b4.Te6edf3sizeTb4b4b4) Tb4b4b4{
Te6edf3listStateTb4b4b4.Te6edf3requestScrollToItemTb4b4b4(Te6edf3searchStateTb4b4b4.Te6edf3allMatchesTff7b72[Te6edf3searchStateTb4b4b4.Te6edf3currentMatchIndexTff7b72]Tb4b4b4.Te6edf3logIndexTb4b4b4)
Tb4b4b4}
Tb4b4b4}
T8b949e// Prepare a document creator for exporting logs via SAF
Tff7b72val Te6edf3exportLogsLauncher Tff7b72=
Te6edf3rememberLauncherForActivityResultTb4b4b4(Te6edf3ActivityResultContractsTb4b4b4.Te6edf3CreateDocumentTb4b4b4(Ta5d6ff"Ta5d6fftext/plainTa5d6ff"Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3createdUri Tff7b72-Tff7b72>
Tff7b72if Tb4b4b4(Te6edf3createdUri Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3scopeTb4b4b4.Te6edf3launch Tb4b4b4{ Te6edf3exportAllLogsToUriTb4b4b4(Te6edf3contextTb4b4b4, Te6edf3createdUriTb4b4b4, Te6edf3filteredLogsTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Te6edf3ScaffoldTb4b4b4(
Te6edf3topBar Tff7b72= Tb4b4b4{
Te6edf3MainAppBarTb4b4b4(
Te6edf3title Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3debug_panelTb4b4b4)Tb4b4b4,
Te6edf3ourNode Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3showNodeChip Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3canNavigateUp Tff7b72= Tff7b72trueTb4b4b4,
Te6edf3onNavigateUp Tff7b72= Te6edf3onNavigateUpTb4b4b4,
Te6edf3actions Tff7b72= Tb4b4b4{ Te6edf3DebugMenuActionsTb4b4b4(Te6edf3deleteLogs Tff7b72= Tb4b4b4{ Te6edf3viewModelTb4b4b4.Te6edf3deleteAllLogsTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3onClickChip Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4) Tb4b4b4{ Te6edf3paddingValues Tff7b72-Tff7b72>
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3paddingValuesTb4b4b4)Tb4b4b4.Te6edf3fillMaxSizeTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3LazyColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxSizeTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3state Tff7b72= Te6edf3listStateTb4b4b4) Tb4b4b4{
Te6edf3stickyHeader Tb4b4b4{
Tff7b72val Te6edf3animatedAlpha Tff7b72by
Te6edf3animateFloatAsStateTb4b4b4(
Te6edf3targetValue Tff7b72= Tff7b72if Tb4b4b4(Tff7b72!Te6edf3listStateTb4b4b4.Te6edf3isScrollInProgressTb4b4b4) T79c0ff1.0f Tff7b72else T79c0ff0fTb4b4b4,
Te6edf3label Tff7b72= Ta5d6ff"Ta5d6ffalphaTa5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3DebugSearchStateviewModelDefaultsTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3graphicsLayerTb4b4b4(Te6edf3alpha Tff7b72= Te6edf3animatedAlphaTb4b4b4)Tb4b4b4,
Te6edf3searchState Tff7b72= Te6edf3searchStateTb4b4b4,
Te6edf3filterTexts Tff7b72= Te6edf3filterTextsTb4b4b4,
Te6edf3presetFilters Tff7b72= Te6edf3viewModelTb4b4b4.Te6edf3presetFiltersTb4b4b4,
Te6edf3logs Tff7b72= Te6edf3logsTb4b4b4,
Te6edf3filterMode Tff7b72= Te6edf3filterModeTb4b4b4,
Te6edf3onFilterModeChange Tff7b72= Tb4b4b4{ Te6edf3filterMode Tff7b72= Tffa657it Tb4b4b4}Tb4b4b4,
Te6edf3onExportLogs Tff7b72= Tb4b4b4{
Tff7b72val Te6edf3timestamp Tff7b72= Te6edf3SimpleDateFormatTb4b4b4(Ta5d6ff"Ta5d6ffyyyyMMdd_HHmmssTa5d6ff"Tb4b4b4, Te6edf3LocaleTb4b4b4.Te6edf3USTb4b4b4)Tb4b4b4.Te6edf3formatTb4b4b4(Te6edf3DateTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3fileName Tff7b72= Ta5d6ff"Ta5d6ffmeshtastic_debug_Tffd700$Te6edf3timestampTa5d6ff.txtTa5d6ff"
Te6edf3exportLogsLauncherTb4b4b4.Te6edf3launchTb4b4b4(Te6edf3fileNameTb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3itemsTb4b4b4(Te6edf3filteredLogsTb4b4b4, Te6edf3key Tff7b72= Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3uuid Tb4b4b4}Tb4b4b4) Tb4b4b4{ Te6edf3log Tff7b72-Tff7b72>
Te6edf3DebugItemTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3animateItemTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3log Tff7b72= Te6edf3logTb4b4b4,
Te6edf3searchText Tff7b72= Te6edf3searchStateTb4b4b4.Te6edf3searchTextTb4b4b4,
Te6edf3isSelected Tff7b72= Te6edf3selectedLogId Tff7b72=Tff7b72= Te6edf3logTb4b4b4.Te6edf3uuidTb4b4b4,
Te6edf3onLogClick Tff7b72= Tb4b4b4{ Te6edf3viewModelTb4b4b4.Te6edf3setSelectedLogIdTb4b4b4(Tff7b72if Tb4b4b4(Te6edf3selectedLogId Tff7b72=Tff7b72= Te6edf3logTb4b4b4.Te6edf3uuidTb4b4b4) Tff7b72null Tff7b72else Te6edf3logTb4b4b4.Te6edf3uuidTb4b4b4) Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tf0883e@Composable
Tff7b72internal Tff7b72fun Td2a8ffDebugItemTb4b4b4(
Te6edf3logTb4b4b4: Te6edf3UiMeshLogTb4b4b4,
Te6edf3modifierTb4b4b4: Te6edf3Modifier Tff7b72= Te6edf3ModifierTb4b4b4,
Te6edf3searchTextTb4b4b4: Tffa657String Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4,
Te6edf3isSelectedTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3onLogClickTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657Unit Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3colorScheme Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorScheme

Te6edf3CardTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3modifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3colors Tff7b72=
Te6edf3CardDefaultsTb4b4b4.Te6edf3cardColorsTb4b4b4(
Te6edf3containerColor Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3isSelectedTb4b4b4) Tb4b4b4{
Te6edf3colorSchemeTb4b4b4.Te6edf3primaryTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3alpha Tff7b72= T79c0ff0.1fTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3colorSchemeTb4b4b4.Te6edf3surface
Tb4b4b4}Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3border Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3isSelectedTb4b4b4) Tb4b4b4{
Te6edf3BorderStrokeTb4b4b4(T79c0ff2.Te6edf3dpTb4b4b4, Te6edf3colorSchemeTb4b4b4.Te6edf3primaryTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72null
Tb4b4b4}Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3SelectionContainer Tb4b4b4{
Te6edf3ColumnTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Tff7b72if Tb4b4b4(Te6edf3isSelectedTb4b4b4) T79c0ff1T79c0ff2.Te6edf3dp Tff7b72else T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3clickable Tb4b4b4{ Te6edf3onLogClickTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3DebugItemHeaderTb4b4b4(Te6edf3log Tff7b72= Te6edf3logTb4b4b4, Te6edf3searchText Tff7b72= Te6edf3searchTextTb4b4b4, Te6edf3isSelected Tff7b72= Te6edf3isSelectedTb4b4b4, Te6edf3theme Tff7b72= Te6edf3colorSchemeTb4b4b4)
Tff7b72val Te6edf3messageAnnotatedString Tff7b72= Te6edf3rememberAnnotatedLogMessageTb4b4b4(Te6edf3logTb4b4b4, Te6edf3searchTextTb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3messageAnnotatedStringTb4b4b4,
Te6edf3style Tff7b72=
Te6edf3TextStyleTb4b4b4(
Te6edf3fontSize Tff7b72= Tff7b72if Tb4b4b4(Te6edf3isSelectedTb4b4b4) T79c0ff1T79c0ff2.Te6edf3sp Tff7b72else T79c0ff9.Te6edf3spTb4b4b4,
Te6edf3fontFamily Tff7b72= Te6edf3FontFamilyTb4b4b4.Te6edf3MonospaceTb4b4b4,
Te6edf3color Tff7b72= Te6edf3colorSchemeTb4b4b4.Te6edf3onSurfaceTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
T8b949e// Show decoded payload if available, with search highlighting
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3logTb4b4b4.Te6edf3decodedPayloadTb4b4b4.Te6edf3isNullOrBlankTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3DecodedPayloadBlockTb4b4b4(
Te6edf3decodedPayload Tff7b72= Te6edf3logTb4b4b4.Te6edf3decodedPayloadTb4b4b4,
Te6edf3isSelected Tff7b72= Te6edf3isSelectedTb4b4b4,
Te6edf3colorScheme Tff7b72= Te6edf3colorSchemeTb4b4b4,
Te6edf3searchText Tff7b72= Te6edf3searchTextTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffDebugItemHeaderTb4b4b4(Te6edf3logTb4b4b4: Te6edf3UiMeshLogTb4b4b4, Te6edf3searchTextTb4b4b4: Tffa657StringTb4b4b4, Te6edf3isSelectedTb4b4b4: Tffa657BooleanTb4b4b4, Te6edf3themeTb4b4b4: Te6edf3ColorSchemeTb4b4b4) Tb4b4b4{
Te6edf3RowTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3bottom Tff7b72= Tff7b72if Tb4b4b4(Te6edf3isSelectedTb4b4b4) T79c0ff1T79c0ff2.Te6edf3dp Tff7b72else T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3horizontalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3SpaceBetweenTb4b4b4,
Te6edf3verticalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterVerticallyTb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3typeAnnotatedString Tff7b72= Te6edf3rememberAnnotatedStringTb4b4b4(Te6edf3text Tff7b72= Te6edf3logTb4b4b4.Te6edf3messageTypeTb4b4b4, Te6edf3searchText Tff7b72= Te6edf3searchTextTb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3typeAnnotatedStringTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3weightTb4b4b4(T79c0ff1fTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72=
Te6edf3TextStyleTb4b4b4(
Te6edf3fontWeight Tff7b72= Te6edf3FontWeightTb4b4b4.Te6edf3BoldTb4b4b4,
Te6edf3fontSize Tff7b72= Tff7b72if Tb4b4b4(Te6edf3isSelectedTb4b4b4) T79c0ff1T79c0ff6.Te6edf3sp Tff7b72else T79c0ff1T79c0ff4.Te6edf3spTb4b4b4,
Te6edf3color Tff7b72= Te6edf3themeTb4b4b4.Te6edf3onSurfaceTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
T8b949e// Copy full log: message + decoded payload if present
Tff7b72val Te6edf3fullLogText Tff7b72=
Te6edf3rememberTb4b4b4(Te6edf3logTb4b4b4.Te6edf3logMessageTb4b4b4, Te6edf3logTb4b4b4.Te6edf3decodedPayloadTb4b4b4) Tb4b4b4{
Te6edf3buildString Tb4b4b4{
Te6edf3appendTb4b4b4(Te6edf3logTb4b4b4.Te6edf3logMessageTb4b4b4)
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3logTb4b4b4.Te6edf3decodedPayloadTb4b4b4.Te6edf3isNullOrBlankTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3appendTb4b4b4(Ta5d6ff"Ta5d6ff\Ta5d6ffnTa5d6ff\Ta5d6ffnDecoded Payload:Ta5d6ff\Ta5d6ffn{Ta5d6ff"Tb4b4b4)
Te6edf3appendTb4b4b4(Ta5d6ff"Ta5d6ff\Ta5d6ffnTa5d6ff"Tb4b4b4)
Te6edf3appendTb4b4b4(Te6edf3logTb4b4b4.Te6edf3decodedPayloadTb4b4b4)
Te6edf3appendTb4b4b4(Ta5d6ff"Ta5d6ff\Ta5d6ffn}Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Te6edf3CopyIconButtonTb4b4b4(Te6edf3valueToCopy Tff7b72= Te6edf3fullLogTextTb4b4b4, Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3start Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3dateAnnotatedString Tff7b72= Te6edf3rememberAnnotatedStringTb4b4b4(Te6edf3text Tff7b72= Te6edf3logTb4b4b4.Te6edf3formattedReceivedDateTb4b4b4, Te6edf3searchText Tff7b72= Te6edf3searchTextTb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3dateAnnotatedStringTb4b4b4,
Te6edf3style Tff7b72=
Te6edf3TextStyleTb4b4b4(
Te6edf3fontWeight Tff7b72= Te6edf3FontWeightTb4b4b4.Te6edf3BoldTb4b4b4,
Te6edf3fontSize Tff7b72= Tff7b72if Tb4b4b4(Te6edf3isSelectedTb4b4b4) T79c0ff1T79c0ff4.Te6edf3sp Tff7b72else T79c0ff1T79c0ff2.Te6edf3spTb4b4b4,
Te6edf3color Tff7b72= Te6edf3themeTb4b4b4.Te6edf3onSurfaceTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffrememberAnnotatedStringTb4b4b4(Te6edf3textTb4b4b4: Tffa657StringTb4b4b4, Te6edf3searchTextTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Te6edf3AnnotatedString Tb4b4b4{
Tff7b72val Te6edf3theme Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorScheme
Tff7b72val Te6edf3highlightStyle Tff7b72= Te6edf3SpanStyleTb4b4b4(Te6edf3background Tff7b72= Te6edf3themeTb4b4b4.Te6edf3primaryTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3alpha Tff7b72= T79c0ff0.3fTb4b4b4)Tb4b4b4, Te6edf3color Tff7b72= Te6edf3themeTb4b4b4.Te6edf3onSurfaceTb4b4b4)

Tff7b72return Te6edf3rememberTb4b4b4(Te6edf3textTb4b4b4, Te6edf3searchTextTb4b4b4) Tb4b4b4{
Te6edf3buildAnnotatedString Tb4b4b4{
Te6edf3appendTb4b4b4(Te6edf3textTb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3searchTextTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3searchTextTb4b4b4.Te6edf3splitTb4b4b4(Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3forEach Tb4b4b4{ Te6edf3term Tff7b72-Tff7b72>
Te6edf3RegexTb4b4b4(Te6edf3RegexTb4b4b4.Te6edf3escapeTb4b4b4(Te6edf3termTb4b4b4)Tb4b4b4, Te6edf3RegexOptionTb4b4b4.Te6edf3IGNORE_CASETb4b4b4)Tb4b4b4.Te6edf3findAllTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4.Te6edf3forEach Tb4b4b4{ Te6edf3match Tff7b72-Tff7b72>
Te6edf3addStyleTb4b4b4(Te6edf3style Tff7b72= Te6edf3highlightStyleTb4b4b4, Te6edf3start Tff7b72= Te6edf3matchTb4b4b4.Te6edf3rangeTb4b4b4.Te6edf3firstTb4b4b4, Te6edf3end Tff7b72= Te6edf3matchTb4b4b4.Te6edf3rangeTb4b4b4.Te6edf3last Tff7b72+ T79c0ff1Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffrememberAnnotatedLogMessageTb4b4b4(Te6edf3logTb4b4b4: Te6edf3UiMeshLogTb4b4b4, Te6edf3searchTextTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Te6edf3AnnotatedString Tb4b4b4{
Tff7b72val Te6edf3theme Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorScheme
Tff7b72val Te6edf3style Tff7b72= Te6edf3SpanStyleTb4b4b4(Te6edf3color Tff7b72= Te6edf3AnnotationColorTb4b4b4, Te6edf3fontStyle Tff7b72= Te6edf3FontStyleTb4b4b4.Te6edf3ItalicTb4b4b4)
Tff7b72val Te6edf3highlightStyle Tff7b72= Te6edf3SpanStyleTb4b4b4(Te6edf3background Tff7b72= Te6edf3themeTb4b4b4.Te6edf3primaryTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3alpha Tff7b72= T79c0ff0.3fTb4b4b4)Tb4b4b4, Te6edf3color Tff7b72= Te6edf3themeTb4b4b4.Te6edf3onSurfaceTb4b4b4)

Tff7b72return Te6edf3rememberTb4b4b4(Te6edf3logTb4b4b4.Te6edf3uuidTb4b4b4, Te6edf3searchTextTb4b4b4) Tb4b4b4{
Te6edf3buildAnnotatedString Tb4b4b4{
Te6edf3appendTb4b4b4(Te6edf3logTb4b4b4.Te6edf3logMessageTb4b4b4)

T8b949e// Add node ID annotations
Te6edf3REGEX_ANNOTATED_NODE_IDTb4b4b4.Te6edf3findAllTb4b4b4(Te6edf3logTb4b4b4.Te6edf3logMessageTb4b4b4)Tb4b4b4.Te6edf3toListTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3reversedTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3forEach Tb4b4b4{
Te6edf3addStyleTb4b4b4(Te6edf3style Tff7b72= Te6edf3styleTb4b4b4, Te6edf3start Tff7b72= Tffa657itTb4b4b4.Te6edf3rangeTb4b4b4.Te6edf3firstTb4b4b4, Te6edf3end Tff7b72= Tffa657itTb4b4b4.Te6edf3rangeTb4b4b4.Te6edf3last Tff7b72+ T79c0ff1Tb4b4b4)
Tb4b4b4}

T8b949e// Add search highlight annotations
Tff7b72if Tb4b4b4(Te6edf3searchTextTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3searchTextTb4b4b4.Te6edf3splitTb4b4b4(Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3forEach Tb4b4b4{ Te6edf3term Tff7b72-Tff7b72>
Te6edf3RegexTb4b4b4(Te6edf3RegexTb4b4b4.Te6edf3escapeTb4b4b4(Te6edf3termTb4b4b4)Tb4b4b4, Te6edf3RegexOptionTb4b4b4.Te6edf3IGNORE_CASETb4b4b4)Tb4b4b4.Te6edf3findAllTb4b4b4(Te6edf3logTb4b4b4.Te6edf3logMessageTb4b4b4)Tb4b4b4.Te6edf3forEach Tb4b4b4{ Te6edf3match Tff7b72-Tff7b72>
Te6edf3addStyleTb4b4b4(Te6edf3style Tff7b72= Te6edf3highlightStyleTb4b4b4, Te6edf3start Tff7b72= Te6edf3matchTb4b4b4.Te6edf3rangeTb4b4b4.Te6edf3firstTb4b4b4, Te6edf3end Tff7b72= Te6edf3matchTb4b4b4.Te6edf3rangeTb4b4b4.Te6edf3last Tff7b72+ T79c0ff1Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tf0883e@Composable
Tff7b72fun Td2a8ffDebugMenuActionsTb4b4b4(Te6edf3deleteLogsTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4, Te6edf3modifierTb4b4b4: Te6edf3Modifier Tff7b72= Te6edf3ModifierTb4b4b4) Tb4b4b4{
Tff7b72var Te6edf3showDeleteLogsDialog Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Tff7b72falseTb4b4b4) Tb4b4b4}

Te6edf3IconButtonTb4b4b4(Te6edf3onClick Tff7b72= Tb4b4b4{ Te6edf3showDeleteLogsDialog Tff7b72= Tff7b72true Tb4b4b4}Tb4b4b4, Te6edf3modifier Tff7b72= Te6edf3modifierTb4b4b4.Te6edf3paddingTb4b4b4(T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(Te6edf3imageVector Tff7b72= Te6edf3IconsTb4b4b4.Te6edf3DefaultTb4b4b4.Te6edf3DeleteTb4b4b4, Te6edf3contentDescription Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3debug_clearTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3showDeleteLogsDialogTb4b4b4) Tb4b4b4{
Te6edf3SimpleAlertDialogTb4b4b4(
Te6edf3title Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3debug_clearTb4b4b4,
Te6edf3text Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3debug_clear_logs_confirmTb4b4b4,
Te6edf3onConfirm Tff7b72= Tb4b4b4{
Te6edf3showDeleteLogsDialog Tff7b72= Tff7b72false
Te6edf3deleteLogsTb4b4b4(Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3onDismiss Tff7b72= Tb4b4b4{ Te6edf3showDeleteLogsDialog Tff7b72= Tff7b72false Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72suspend Tff7b72fun Td2a8ffexportAllLogsToUriTb4b4b4(Te6edf3contextTb4b4b4: Te6edf3ContextTb4b4b4, Te6edf3targetUriTb4b4b4: Te6edf3UriTb4b4b4, Te6edf3logsTb4b4b4: Te6edf3ListTff7b72<Te6edf3UiMeshLogTff7b72>Tb4b4b4) Tff7b72=
Te6edf3withContextTb4b4b4(Te6edf3DispatchersTb4b4b4.Te6edf3IOTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3contextTb4b4b4.Te6edf3contentResolverTb4b4b4.Te6edf3openOutputStreamTb4b4b4(Te6edf3targetUriTb4b4b4)Tff7b72?.Te6edf3use Tb4b4b4{ Te6edf3os Tff7b72-Tff7b72>
Te6edf3OutputStreamWriterTb4b4b4(Te6edf3osTb4b4b4, Te6edf3StandardCharsetsTb4b4b4.Te6edf3UTF_8Tb4b4b4)Tb4b4b4.Te6edf3use Tb4b4b4{ Te6edf3writer Tff7b72-Tff7b72>
Te6edf3logsTb4b4b4.Te6edf3forEach Tb4b4b4{ Te6edf3log Tff7b72-Tff7b72>
Te6edf3writerTb4b4b4.Te6edf3writeTb4b4b4(Ta5d6ff"Tffd700${Te6edf3logTb4b4b4.Te6edf3formattedReceivedDateTffd700}Ta5d6ff [Tffd700${Te6edf3logTb4b4b4.Te6edf3messageTypeTffd700}Ta5d6ff]Ta5d6ff\Ta5d6ffnTa5d6ff"Tb4b4b4)
Te6edf3writerTb4b4b4.Te6edf3writeTb4b4b4(Te6edf3logTb4b4b4.Te6edf3logMessageTb4b4b4)
Te6edf3logTb4b4b4.Te6edf3decodedPayloadTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3decodedPayload Tff7b72-Tff7b72>
Tff7b72if Tb4b4b4(Te6edf3decodedPayloadTb4b4b4.Te6edf3isNotBlankTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3writerTb4b4b4.Te6edf3writeTb4b4b4(Ta5d6ff"Ta5d6ff\Ta5d6ffnTa5d6ff\Ta5d6ffnDecoded Payload:Ta5d6ff\Ta5d6ffn{Ta5d6ff"Tb4b4b4)
Te6edf3writerTb4b4b4.Te6edf3writeTb4b4b4(Ta5d6ff"Ta5d6ff\Ta5d6ffnTa5d6ff"Tb4b4b4)
T8b949e// Redact Decoded keys.
Te6edf3decodedPayloadTb4b4b4.Te6edf3lineSequenceTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3forEach Tb4b4b4{ Te6edf3line Tff7b72-Tff7b72>
Tff7b72var Te6edf3outputLine Tff7b72= Te6edf3line
Tff7b72val Te6edf3redacted Tff7b72= Te6edf3redactedKeysTb4b4b4.Te6edf3firstOrNull Tb4b4b4{ Te6edf3lineTb4b4b4.Te6edf3containsTb4b4b4(Tffa657itTb4b4b4) Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3redacted Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3idx Tff7b72= Te6edf3lineTb4b4b4.Te6edf3indexOfTb4b4b4(Ta5d6ff':'Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3idx Tff7b72!Tff7b72= Tff7b72-T79c0ff1Tb4b4b4) Tb4b4b4{
Te6edf3outputLine Tff7b72= Te6edf3lineTb4b4b4.Te6edf3takeTb4b4b4(Te6edf3idx Tff7b72+ T79c0ff1Tb4b4b4)
Te6edf3outputLine Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff<redacted>Ta5d6ff"
Tb4b4b4}
Tb4b4b4}
Te6edf3writerTb4b4b4.Te6edf3writeTb4b4b4(Te6edf3outputLineTb4b4b4)
Te6edf3writerTb4b4b4.Te6edf3writeTb4b4b4(Ta5d6ff"Ta5d6ff\Ta5d6ffnTa5d6ff"Tb4b4b4)
Tb4b4b4}
Te6edf3writerTb4b4b4.Te6edf3writeTb4b4b4(Ta5d6ff"Ta5d6ff\Ta5d6ffn}Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Te6edf3writerTb4b4b4.Te6edf3writeTb4b4b4(Ta5d6ff"Ta5d6ff\Ta5d6ffnTa5d6ff\Ta5d6ffnTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4} Tff7b72?: Te6edf3run Tb4b4b4{ Tff7b72throw Te6edf3IOExceptionTb4b4b4(Ta5d6ff"Ta5d6ffUnable to open output stream for URI: Tffd700$Te6edf3targetUriTa5d6ff"Tb4b4b4) Tb4b4b4}

Te6edf3withContextTb4b4b4(Te6edf3DispatchersTb4b4b4.Te6edf3MainTb4b4b4) Tb4b4b4{ Te6edf3contextTb4b4b4.Te6edf3showToastTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3debug_export_successTb4b4b4, Te6edf3logsTb4b4b4.Te6edf3sizeTb4b4b4) Tb4b4b4}
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4: Te6edf3IOExceptionTb4b4b4) Tb4b4b4{
Te6edf3withContextTb4b4b4(Te6edf3DispatchersTb4b4b4.Te6edf3MainTb4b4b4) Tb4b4b4{ Te6edf3contextTb4b4b4.Te6edf3showToastTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3debug_export_failedTb4b4b4, Te6edf3eTb4b4b4.Te6edf3message Tff7b72?: Ta5d6ff"Ta5d6ff"Tb4b4b4) Tb4b4b4}
Te6edf3TimberTb4b4b4.Te6edf3wTb4b4b4(Te6edf3eTb4b4b4, Ta5d6ff"Ta5d6ffError:IOException Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffDecodedPayloadBlockTb4b4b4(
Te6edf3decodedPayloadTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3isSelectedTb4b4b4: Tffa657BooleanTb4b4b4,
Te6edf3colorSchemeTb4b4b4: Te6edf3ColorSchemeTb4b4b4,
Te6edf3searchTextTb4b4b4: Tffa657String Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4,
Te6edf3modifierTb4b4b4: Te6edf3Modifier Tff7b72= Te6edf3ModifierTb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3commonTextStyle Tff7b72=
Te6edf3TextStyleTb4b4b4(Te6edf3fontSize Tff7b72= Tff7b72if Tb4b4b4(Te6edf3isSelectedTb4b4b4) T79c0ff1T79c0ff0.Te6edf3sp Tff7b72else T79c0ff8.Te6edf3spTb4b4b4, Te6edf3fontWeight Tff7b72= Te6edf3FontWeightTb4b4b4.Te6edf3BoldTb4b4b4, Te6edf3color Tff7b72= Te6edf3colorSchemeTb4b4b4.Te6edf3primaryTb4b4b4)

Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3modifierTb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3debug_decoded_payloadTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3commonTextStyleTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3top Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4, Te6edf3bottom Tff7b72= T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Ta5d6ff"Ta5d6ff{Ta5d6ff"Tb4b4b4, Te6edf3style Tff7b72= Te6edf3commonTextStyleTb4b4b4, Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3start Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4, Te6edf3bottom Tff7b72= T79c0ff2.Te6edf3dpTb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3annotatedPayload Tff7b72= Te6edf3rememberAnnotatedDecodedPayloadTb4b4b4(Te6edf3decodedPayloadTb4b4b4, Te6edf3searchTextTb4b4b4, Te6edf3colorSchemeTb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3annotatedPayloadTb4b4b4,
Te6edf3softWrap Tff7b72= Tff7b72trueTb4b4b4,
Te6edf3style Tff7b72=
Te6edf3TextStyleTb4b4b4(
Te6edf3fontSize Tff7b72= Tff7b72if Tb4b4b4(Te6edf3isSelectedTb4b4b4) T79c0ff1T79c0ff0.Te6edf3sp Tff7b72else T79c0ff8.Te6edf3spTb4b4b4,
Te6edf3fontFamily Tff7b72= Te6edf3FontFamilyTb4b4b4.Te6edf3MonospaceTb4b4b4,
Te6edf3color Tff7b72= Te6edf3colorSchemeTb4b4b4.Te6edf3onSurfaceTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3alpha Tff7b72= T79c0ff0.8fTb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3start Tff7b72= T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4, Te6edf3bottom Tff7b72= T79c0ff0.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Ta5d6ff"Ta5d6ff}Ta5d6ff"Tb4b4b4, Te6edf3style Tff7b72= Te6edf3commonTextStyleTb4b4b4, Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3start Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4, Te6edf3bottom Tff7b72= T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffrememberAnnotatedDecodedPayloadTb4b4b4(
Te6edf3decodedPayloadTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3searchTextTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3colorSchemeTb4b4b4: Te6edf3ColorSchemeTb4b4b4,
Tb4b4b4)Tb4b4b4: Te6edf3AnnotatedString Tb4b4b4{
Tff7b72val Te6edf3highlightStyle Tff7b72= Te6edf3SpanStyleTb4b4b4(Te6edf3background Tff7b72= Te6edf3colorSchemeTb4b4b4.Te6edf3primaryTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3alpha Tff7b72= T79c0ff0.3fTb4b4b4)Tb4b4b4, Te6edf3color Tff7b72= Te6edf3colorSchemeTb4b4b4.Te6edf3onSurfaceTb4b4b4)
Tff7b72return Te6edf3rememberTb4b4b4(Te6edf3decodedPayloadTb4b4b4, Te6edf3searchTextTb4b4b4) Tb4b4b4{
Te6edf3buildAnnotatedString Tb4b4b4{
Te6edf3appendTb4b4b4(Te6edf3decodedPayloadTb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3searchTextTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3searchTextTb4b4b4.Te6edf3splitTb4b4b4(Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3forEach Tb4b4b4{ Te6edf3term Tff7b72-Tff7b72>
Te6edf3RegexTb4b4b4(Te6edf3RegexTb4b4b4.Te6edf3escapeTb4b4b4(Te6edf3termTb4b4b4)Tb4b4b4, Te6edf3RegexOptionTb4b4b4.Te6edf3IGNORE_CASETb4b4b4)Tb4b4b4.Te6edf3findAllTb4b4b4(Te6edf3decodedPayloadTb4b4b4)Tb4b4b4.Te6edf3forEach Tb4b4b4{ Te6edf3match Tff7b72-Tff7b72>
Te6edf3addStyleTb4b4b4(Te6edf3style Tff7b72= Te6edf3highlightStyleTb4b4b4, Te6edf3start Tff7b72= Te6edf3matchTb4b4b4.Te6edf3rangeTb4b4b4.Te6edf3firstTb4b4b4, Te6edf3end Tff7b72= Te6edf3matchTb4b4b4.Te6edf3rangeTb4b4b4.Te6edf3last Tff7b72+ T79c0ff1Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tf0883e@PreviewLightDark
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffDebugPacketPreviewTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3AppTheme Tb4b4b4{
Te6edf3DebugItemTb4b4b4(
Te6edf3UiMeshLogTb4b4b4(
Te6edf3uuid Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4,
Te6edf3messageType Tff7b72= Ta5d6ff"Ta5d6ffNodeInfoTa5d6ff"Tb4b4b4,
Te6edf3formattedReceivedDate Tff7b72= Ta5d6ff"Ta5d6ff9/27/20, 8:00:58 PMTa5d6ff"Tb4b4b4,
Te6edf3logMessage Tff7b72=
Ta5d6ff"Ta5d6fffrom: 2885173132Ta5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ffdecoded {Ta5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ff position {Ta5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ff altitude: 60Ta5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ff battery_level: 81Ta5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ff latitude_i: 411111136Ta5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ff longitude_i: -711111805Ta5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ff time: 1600390966Ta5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ff }Ta5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ff}Ta5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ffhop_limit: 3Ta5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ffid: 1737414295Ta5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ffrx_snr: 9.5Ta5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ffrx_time: 316400569Ta5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ffto: -1409790708Ta5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tf0883e@PreviewLightDark
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffDebugItemWithSearchHighlightPreviewTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3AppTheme Tb4b4b4{
Te6edf3DebugItemTb4b4b4(
Te6edf3UiMeshLogTb4b4b4(
Te6edf3uuid Tff7b72= Ta5d6ff"Ta5d6ff1Ta5d6ff"Tb4b4b4,
Te6edf3messageType Tff7b72= Ta5d6ff"Ta5d6ffTextMessageTa5d6ff"Tb4b4b4,
Te6edf3formattedReceivedDate Tff7b72= Ta5d6ff"Ta5d6ff9/27/20, 8:00:58 PMTa5d6ff"Tb4b4b4,
Te6edf3logMessage Tff7b72= Ta5d6ff"Ta5d6ffHello world! This is a test message with some keywords to search for.Ta5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3searchText Tff7b72= Ta5d6ff"Ta5d6fftest messageTa5d6ff"Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tf0883e@PreviewLightDark
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffDebugItemPositionPreviewTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3AppTheme Tb4b4b4{
Te6edf3DebugItemTb4b4b4(
Te6edf3UiMeshLogTb4b4b4(
Te6edf3uuid Tff7b72= Ta5d6ff"Ta5d6ff2Ta5d6ff"Tb4b4b4,
Te6edf3messageType Tff7b72= Ta5d6ff"Ta5d6ffPositionTa5d6ff"Tb4b4b4,
Te6edf3formattedReceivedDate Tff7b72= Ta5d6ff"Ta5d6ff9/27/20, 8:01:15 PMTa5d6ff"Tb4b4b4,
Te6edf3logMessage Tff7b72= Ta5d6ff"Ta5d6ffPosition update from node (!a1b2c3d4) at coordinates 40.7128, -74.0060Ta5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tf0883e@PreviewLightDark
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffDebugItemErrorPreviewTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3AppTheme Tb4b4b4{
Te6edf3DebugItemTb4b4b4(
Te6edf3UiMeshLogTb4b4b4(
Te6edf3uuid Tff7b72= Ta5d6ff"Ta5d6ff3Ta5d6ff"Tb4b4b4,
Te6edf3messageType Tff7b72= Ta5d6ff"Ta5d6ffErrorTa5d6ff"Tb4b4b4,
Te6edf3formattedReceivedDate Tff7b72= Ta5d6ff"Ta5d6ff9/27/20, 8:02:30 PMTa5d6ff"Tb4b4b4,
Te6edf3logMessage Tff7b72=
Ta5d6ff"Ta5d6ffConnection failed: timeout after 30 secondsTa5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ffRetry attempt: 3/5Ta5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ffLast known position: 40.7128, -74.0060Ta5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tf0883e@PreviewLightDark
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffDebugItemLongMessagePreviewTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3AppTheme Tb4b4b4{
Te6edf3DebugItemTb4b4b4(
Te6edf3UiMeshLogTb4b4b4(
Te6edf3uuid Tff7b72= Ta5d6ff"Ta5d6ff4Ta5d6ff"Tb4b4b4,
Te6edf3messageType Tff7b72= Ta5d6ff"Ta5d6ffWaypointTa5d6ff"Tb4b4b4,
Te6edf3formattedReceivedDate Tff7b72= Ta5d6ff"Ta5d6ff9/27/20, 8:03:45 PMTa5d6ff"Tb4b4b4,
Te6edf3logMessage Tff7b72=
Ta5d6ff"Ta5d6ffWaypoint created:Ta5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ff Name: Home BaseTa5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ff Description: Primary meeting locationTa5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ff Latitude: 40.7128Ta5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ff Longitude: -74.0060Ta5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ff Altitude: 100mTa5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ff Icon: 🏠Ta5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ff Created by: (!a1b2c3d4)Ta5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ff Expires: 2025-12-31 23:59:59Ta5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tf0883e@PreviewLightDark
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffDebugItemSelectedPreviewTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3AppTheme Tb4b4b4{
Te6edf3DebugItemTb4b4b4(
Te6edf3UiMeshLogTb4b4b4(
Te6edf3uuid Tff7b72= Ta5d6ff"Ta5d6ff5Ta5d6ff"Tb4b4b4,
Te6edf3messageType Tff7b72= Ta5d6ff"Ta5d6ffTextMessageTa5d6ff"Tb4b4b4,
Te6edf3formattedReceivedDate Tff7b72= Ta5d6ff"Ta5d6ff9/27/20, 8:04:20 PMTa5d6ff"Tb4b4b4,
Te6edf3logMessage Tff7b72= Ta5d6ff"Ta5d6ffThis is a selected log item with larger font sizes for better readability.Ta5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3isSelected Tff7b72= Tff7b72trueTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tf0883e@PreviewLightDark
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffDebugMenuActionsPreviewTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3AppTheme Tb4b4b4{
Te6edf3RowTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3IconButtonTb4b4b4(Te6edf3onClick Tff7b72= Tb4b4b4{ T8b949e/* Preview only */ Tb4b4b4}Tb4b4b4, Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(
Te6edf3imageVector Tff7b72= Te6edf3IconsTb4b4b4.Te6edf3OutlinedTb4b4b4.Te6edf3FileDownloadTb4b4b4,
Te6edf3contentDescription Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3debug_logs_exportTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3IconButtonTb4b4b4(Te6edf3onClick Tff7b72= Tb4b4b4{ T8b949e/* Preview only */ Tb4b4b4}Tb4b4b4, Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(Te6edf3imageVector Tff7b72= Te6edf3IconsTb4b4b4.Te6edf3DefaultTb4b4b4.Te6edf3DeleteTb4b4b4, Te6edf3contentDescription Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3debug_clearTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tf0883e@PreviewLightDark
Tf0883e@Composable
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffdetekt:LongMethodTa5d6ff"Tb4b4b4) T8b949e// big preview
Tff7b72private Tff7b72fun Td2a8ffDebugScreenEmptyPreviewTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3AppTheme Tb4b4b4{
Te6edf3Surface Tb4b4b4{
Te6edf3LazyColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxSizeTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3stickyHeader Tb4b4b4{
Te6edf3SurfaceTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3RowTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3horizontalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3SpaceBetweenTb4b4b4,
Te6edf3verticalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterVerticallyTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3RowTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3weightTb4b4b4(T79c0ff1fTb4b4b4)Tb4b4b4,
Te6edf3horizontalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3StartTb4b4b4,
Te6edf3verticalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterVerticallyTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3OutlinedTextFieldTb4b4b4(
Te6edf3value Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4,
Te6edf3onValueChange Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3weightTb4b4b4(T79c0ff1fTb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3end Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3placeholder Tff7b72= Tb4b4b4{ Te6edf3TextTb4b4b4(Ta5d6ff"Ta5d6ffSearch in logs...Ta5d6ff"Tb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3singleLine Tff7b72= Tff7b72trueTb4b4b4,
Tb4b4b4)
Te6edf3TextButtonTb4b4b4(Te6edf3onClick Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4) Tb4b4b4{
Te6edf3RowTb4b4b4(Te6edf3verticalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterVerticallyTb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Ta5d6ff"Ta5d6ffFiltersTa5d6ff"Tb4b4b4, Te6edf3style Tff7b72= Te6edf3TextStyleTb4b4b4(Te6edf3fontWeight Tff7b72= Te6edf3FontWeightTb4b4b4.Te6edf3BoldTb4b4b4)Tb4b4b4)
Te6edf3IconTb4b4b4(
Te6edf3imageVector Tff7b72= Te6edf3IconsTb4b4b4.Te6edf3TwoToneTb4b4b4.Te6edf3FilterAltOffTb4b4b4,
Te6edf3contentDescription Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3debug_filtersTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
T8b949e// Empty state
Te6edf3item Tb4b4b4{
Te6edf3BoxTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(T79c0ff3T79c0ff2.Te6edf3dpTb4b4b4)Tb4b4b4, Te6edf3contentAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterTb4b4b4) Tb4b4b4{
Te6edf3ColumnTb4b4b4(Te6edf3horizontalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterHorizontallyTb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Ta5d6ff"Ta5d6ffNo Debug LogsTa5d6ff"Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3TextStyleTb4b4b4(Te6edf3fontSize Tff7b72= T79c0ff1T79c0ff8.Te6edf3spTb4b4b4, Te6edf3fontWeight Tff7b72= Te6edf3FontWeightTb4b4b4.Te6edf3BoldTb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Ta5d6ff"Ta5d6ffDebug logs will appear here when availableTa5d6ff"Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3TextStyleTb4b4b4(Te6edf3fontSize Tff7b72= T79c0ff1T79c0ff4.Te6edf3spTb4b4b4, Te6edf3color Tff7b72= Te6edf3ColorTb4b4b4.Te6edf3GrayTb4b4b4)Tb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3top Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tf0883e@PreviewLightDark
Tf0883e@Composable
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffdetekt:LongMethodTa5d6ff"Tb4b4b4) T8b949e// big preview
Tff7b72private Tff7b72fun Td2a8ffDebugScreenWithSampleDataPreviewTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3AppTheme Tb4b4b4{
Tff7b72val Te6edf3sampleLogs Tff7b72=
Te6edf3listOfTb4b4b4(
Te6edf3UiMeshLogTb4b4b4(
Te6edf3uuid Tff7b72= Ta5d6ff"Ta5d6ff1Ta5d6ff"Tb4b4b4,
Te6edf3messageType Tff7b72= Ta5d6ff"Ta5d6ffNodeInfoTa5d6ff"Tb4b4b4,
Te6edf3formattedReceivedDate Tff7b72= Ta5d6ff"Ta5d6ff9/27/20, 8:00:58 PMTa5d6ff"Tb4b4b4,
Te6edf3logMessage Tff7b72=
Ta5d6ff"Ta5d6fffrom: 2885173132Ta5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ffdecoded {Ta5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ff position {Ta5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ff altitude: 60Ta5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ff battery_level: 81Ta5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ff latitude_i: 411111136Ta5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ff longitude_i: -711111805Ta5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ff time: 1600390966Ta5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ff }Ta5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ff}Ta5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ffhop_limit: 3Ta5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ffid: 1737414295Ta5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ffrx_snr: 9.5Ta5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ffrx_time: 316400569Ta5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ffto: -1409790708Ta5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3UiMeshLogTb4b4b4(
Te6edf3uuid Tff7b72= Ta5d6ff"Ta5d6ff2Ta5d6ff"Tb4b4b4,
Te6edf3messageType Tff7b72= Ta5d6ff"Ta5d6ffTextMessageTa5d6ff"Tb4b4b4,
Te6edf3formattedReceivedDate Tff7b72= Ta5d6ff"Ta5d6ff9/27/20, 8:01:15 PMTa5d6ff"Tb4b4b4,
Te6edf3logMessage Tff7b72= Ta5d6ff"Ta5d6ffHello from node (!a1b2c3d4)! How's the weather today?Ta5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3UiMeshLogTb4b4b4(
Te6edf3uuid Tff7b72= Ta5d6ff"Ta5d6ff3Ta5d6ff"Tb4b4b4,
Te6edf3messageType Tff7b72= Ta5d6ff"Ta5d6ffPositionTa5d6ff"Tb4b4b4,
Te6edf3formattedReceivedDate Tff7b72= Ta5d6ff"Ta5d6ff9/27/20, 8:02:30 PMTa5d6ff"Tb4b4b4,
Te6edf3logMessage Tff7b72= Ta5d6ff"Ta5d6ffPosition update: 40.7128, -74.0060, altitude: 100m, battery: 85%Ta5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3UiMeshLogTb4b4b4(
Te6edf3uuid Tff7b72= Ta5d6ff"Ta5d6ff4Ta5d6ff"Tb4b4b4,
Te6edf3messageType Tff7b72= Ta5d6ff"Ta5d6ffWaypointTa5d6ff"Tb4b4b4,
Te6edf3formattedReceivedDate Tff7b72= Ta5d6ff"Ta5d6ff9/27/20, 8:03:45 PMTa5d6ff"Tb4b4b4,
Te6edf3logMessage Tff7b72= Ta5d6ff"Ta5d6ffNew waypoint created: 'Meeting Point' at 40.7589, -73.9851Ta5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3UiMeshLogTb4b4b4(
Te6edf3uuid Tff7b72= Ta5d6ff"Ta5d6ff5Ta5d6ff"Tb4b4b4,
Te6edf3messageType Tff7b72= Ta5d6ff"Ta5d6ffErrorTa5d6ff"Tb4b4b4,
Te6edf3formattedReceivedDate Tff7b72= Ta5d6ff"Ta5d6ff9/27/20, 8:04:20 PMTa5d6ff"Tb4b4b4,
Te6edf3logMessage Tff7b72= Ta5d6ff"Ta5d6ffConnection timeout - retrying in 5 seconds...Ta5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)

T8b949e// Note: This preview shows the UI structure but won't have actual data
T8b949e// since the ViewModel isn't injected in previews
Te6edf3Surface Tb4b4b4{
Te6edf3LazyColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxSizeTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3stickyHeader Tb4b4b4{
Te6edf3SurfaceTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Ta5d6ff"Ta5d6ffDebug Screen PreviewTa5d6ff"Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3TextStyleTb4b4b4(Te6edf3fontWeight Tff7b72= Te6edf3FontWeightTb4b4b4.Te6edf3BoldTb4b4b4)Tb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3bottom Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Ta5d6ff"Ta5d6ffSearch and filter controls would appear hereTa5d6ff"Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3TextStyleTb4b4b4(Te6edf3fontSize Tff7b72= T79c0ff1T79c0ff2.Te6edf3spTb4b4b4, Te6edf3color Tff7b72= Te6edf3ColorTb4b4b4.Te6edf3GrayTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Te6edf3itemsTb4b4b4(Te6edf3sampleLogsTb4b4b4) Tb4b4b4{ Te6edf3log Tff7b72-Tff7b72> Te6edf3DebugItemTb4b4b4(Te6edf3log Tff7b72= Te6edf3logTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Served by rngit 1.5.2 - Generated in 0.1s